//package com.ruiysoft.controller.sms;
//
//import com.alibaba.fastjson.JSON;
//import com.ruiysoft.controller.sms.dto.GreetingDto;
//import com.ruiysoft.controller.sms.service.GreetingApiService;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import javax.websocket.OnClose;
//import javax.websocket.OnError;
//import javax.websocket.OnMessage;
//import javax.websocket.OnOpen;
//import javax.websocket.Session;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
//@Component
//@ServerEndpoint("/websocket/{shopId}/{customer}/{customerService}")
//public class WebSocketController2 {
//
//    private static final Logger log = LoggerFactory.getLogger(WebSocketController2.class);
//
//    public WebSocketController2() {
//        System.out.println("构造WebSocketController！");
//    }
//
//    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
//    private static int onlineCount = 0;
//
////    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话，可以使用Map来存放，其中Key可以为用户标识
////    private static CopyOnWriteArraySet<WebSocketChat2> webSocketSet = new CopyOnWriteArraySet<WebSocketChat2>();
//    //实现服务端与单一客户端通信的话，可以使用Map来存放，其中Key为用户标识
//    private static Map<String, WebSocketController2> connections = new ConcurrentHashMap<>();
//
//    //与某个客户端的连接会话，需要通过它来给客户端发送数据
//    private Session session;
//
//    private String socketId;
//
//    @Resource
//    GreetingApiService greetingApiService;
//
//    /**
//     * 连接建立成功调用的方法
//     * @param session  可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
//     */
//    @OnOpen
//    public void onOpen(@PathParam("shopId") String shopId,
//                        @PathParam("customer") String customer,
//                        @PathParam("customerService") String customerService,
//                        Session session){
//        this.socketId = shopId+"_"+customer+"_"+customerService;
//        //key.append(shopId).append("_").append(customer).append("_").append(customerService);
//        this.session = session;
//        connections.put(this.socketId,this);
//        addOnlineCount();           //在线数加1
//        System.out.println("有新连接加入！当前在线人数为" + getOnlineCount());
//    }
//
//    /**
//     * 连接关闭调用的方法
//     */
//    @OnClose
//    public void onClose(){
//        connections.remove(this.socketId);  //从set中删除
//        subOnlineCount();           //在线数减1
//        System.out.println("有一连接关闭！当前在线人数为" + getOnlineCount());
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     * @param message 客户端发送过来的消息
//     * @param session 可选的参数
//     */
//    @OnMessage
//    public void onMessage(String message, Session session) {
//        System.out.println("来自客户端的消息:" + message);
//        try {
//            GreetingDto dto = JSON.parseObject(message,GreetingDto.class);
//            WebSocketController2 con = connections.get(this.socketId);
//            if(con!=null){
//                boolean ff =  con.session.isOpen();
//                System.out.println("判断是否在线！");
//                con.session.getBasicRemote().sendText(message);
//
//                //业务操作
//                //记录聊天信息
//                String [] r = this.socketId.split("_");
//                greetingApiService.addGreetings(Long.valueOf(r[0]),Long.valueOf(r[1]),Long.valueOf(r[2]));
//                greetingApiService.addMessage(Long.valueOf(r[0]),Long.valueOf(r[1]),Long.valueOf(r[2]),dto);
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 发生错误时调用
//     * @param session
//     * @param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error){
//        log.error("WebSocketController",error);
//        error.printStackTrace();
//    }
//
////    /**
////     * 这个方法与上面几个方法不一样。没有用注解，是根据自己需要添加的方法。
////     * @param message
////     * @throws IOException
////     */
////    public void sendMessage(String message) throws IOException{
////        this.session.getBasicRemote().sendText(message);
////        //this.session.getAsyncRemote().sendText(message);
////    }
//
//    public static synchronized int getOnlineCount() {
//        return onlineCount;
//    }
//
//    public static synchronized void addOnlineCount() {
//        WebSocketController2.onlineCount++;
//    }
//
//    public static synchronized void subOnlineCount() {
//        WebSocketController2.onlineCount--;
//    }
//}
